﻿using System.Windows;
using System.Linq;
using System.Windows.Controls;
using System.Windows.Input;
using BioBrowser.ViewModels;

/* 
* Copyright (c) 2009, The University of Texas at Austin
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, 
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, 
* this list of conditions and the following disclaimer in the documentation and/or other materials 
* provided with the distribution.
*
* Neither the name of The University of Texas at Austin nor the names of its contributors may be 
* used to endorse or promote products derived from this software without specific prior written 
* permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR 
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

namespace BioBrowser.Views
{
    public partial class AddOpenFileView
    {
        public AddOpenFileView()
        {
            InitializeComponent();
            tvItems.SelectedItemChanged += OnTreeViewSelectionChanged;
        }

        private void OnOK(object sender, RoutedEventArgs e)
        {
            DialogResult = true;
        }

        private static TreeViewItem ContainerFromItem(TreeView tv, object item)
        {
            var tvi = (TreeViewItem) tv.ItemContainerGenerator.ContainerFromItem(item);
            return tvi ?? ContainerFromItem(tv.ItemContainerGenerator, tv.Items, item);
        }

        private static TreeViewItem ContainerFromItem(ItemContainerGenerator icg, ItemCollection items, object item)
        {
            foreach (object child in items)
            {
                var parentContainer = (TreeViewItem) icg.ContainerFromItem(child);
                var childContainer = (TreeViewItem) parentContainer.ItemContainerGenerator.ContainerFromItem(item);
                if (childContainer != null)
                    return childContainer;

                var result = ContainerFromItem(parentContainer.ItemContainerGenerator, parentContainer.Items, item);
                if (result != null)
                    return result;
            }
            return null;
        }

        /// <summary>
        /// Simple function to simulate multi-select treeview support by managing selection internally.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnTreeViewSelectionChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            AddOpenFileViewModel vm = (AddOpenFileViewModel)DataContext;
            if (vm == null)
                return;

            object selectedItem = tvItems.SelectedItem;
            TreeViewItem tvi = ContainerFromItem(tvItems, selectedItem);
            if (tvi == null)
                return;

            tvi.IsSelected = false;
            tvi.Focus();

            vm.SelectionChanged(selectedItem);
        }
    }
}
